package JoReg

import "sync"

type Stack struct {
	sync.Mutex
	head *node
	size int
}

type node struct {
	data interface{}
	next *node
}

/**
  创建栈
*/
func MakeStack() *Stack {
	stackPtr := &Stack{
		head: nil,
		size: 0,
	}
	return stackPtr
}

/**
  元素入栈--栈顶
*/
func (this *Stack) Push(data interface{}) {
	nodePtr := &node{
		data: data,
		next: nil,
	}
	nodePtr.next = this.head
	this.head = nodePtr
	this.size++
}

/**
  返回栈的第一个元素值
*/
func (this *Stack) Top() interface{} {
	if this.head == nil {
		return nil
	}
	return this.head.data
}

/**
  弹出栈的第一个元素
*/
func (this *Stack) Pop() interface{} {
	if this.head == nil {
		return nil
	}
	data := this.head.data
	this.head = this.head.next
	this.size--
	return data
}

/**
  获取栈的元素个数
*/
func (this *Stack) Size() int {
	return this.size
}

/**
  判断栈是否为空
*/
func (this *Stack) IsEmpty() bool {
	if this.size == 0 {
		return true
	}
	return false
}
